Reverzni pocitani smycky FOR ... TO ... DO

Otázka od: michal.vojta@iol.cz

15. 9. 2004 17:45

Ahoj,

ted jsem narazil na zajimavy problem:
na jednom miste v kodu mam smycku

var
  i : Integer;

for i := 0 to 15 do
  begin

end;

Pomoci ridici promenne i adresuji hw zarizeni.
Nevim v jakem okamziku tenhle problem vznikl, ale kdyz se pri krokovani
divam na hodnotu promenne i, tak konkretne v tomhle pripade ma pri prvnim
pruchodu smyckou hodnotu 16 a pak pri dalsich pruchodech se tato hodnota
snizuje. Kdyz jsem z experimentalnich duvodu zvysil TO hodnotu na 20, prvni
pruchod smyckou byla hodnota i = 21 a pak se snizovala.
Pocet pruchodu smyckou byl spravny.
Toto chovani je nezavisle na tele smycky, zkousel jsem vse vykopat a jen jsem
zobrazoval MessageBox, porad se to chova stejne.

Delphi 5 Prof
Win 98SE
1,2GHz Celer
128 MB RAM



Odpovedá: Robert Suska

15. 9. 2004 17:55

Ahoj!

Tvoj cyklus neobsahuje kod ktory vyzaduje beh od 0 do 15 a preto si
kompilator povedal,   ze rychlesie to pojde od 16 do 1 a neuskodi to
vysledku Tvojho snazenia.

Robo


> var
> i : Integer;
>
> for i := 0 to 15 do
> begin
>
> end;
>
> Pomoci ridici promenne i adresuji hw zarizeni.
> Nevim v jakem okamziku tenhle problem vznikl, ale kdyz se pri krokovani
> divam na hodnotu promenne i, tak konkretne v tomhle pripade ma pri prvnim
> pruchodu smyckou hodnotu 16 a pak pri dalsich pruchodech se tato hodnota
> snizuje. Kdyz jsem z experimentalnich duvodu zvysil TO hodnotu na 20,
> prvni pruchod smyckou byla hodnota i = 21 a pak se snizovala.
> Pocet pruchodu smyckou byl spravny.
> Toto chovani je nezavisle na tele smycky, zkousel jsem vse vykopat a jen
> jsem zobrazoval MessageBox, porad se to chova stejne.


Odpovedá: Mgr. Zdenek Plachy

15. 9. 2004 17:57

> Ahoj,
>
> ted jsem narazil na zajimavy problem:
> na jednom miste v kodu mam smycku
>
> var
> i : Integer;
>
> for i := 0 to 15 do
> begin
>
> end;
>
> Pomoci ridici promenne i adresuji hw zarizeni.
> Nevim v jakem okamziku tenhle problem vznikl, ale kdyz se pri krokovani
> divam na hodnotu promenne i, tak konkretne v tomhle pripade ma
> pri prvnim pruchodu smyckou hodnotu 16 a pak pri dalsich
> pruchodech se tato hodnota snizuje. Kdyz jsem z experimentalnich
> duvodu zvysil TO hodnotu na 20, prvni pruchod smyckou byla
> hodnota i = 21 a pak se snizovala.
> Pocet pruchodu smyckou byl spravny.
> Toto chovani je nezavisle na tele smycky, zkousel jsem vse
> vykopat a jen jsem zobrazoval MessageBox, porad se to chova stejne.
>
> Delphi 5 Prof
> Win 98SE
> 1,2GHz Celer
> 128 MB RAM
>

Vypnete optimalizaci kodu. Prekladac si s optimalizaci nektere cykly for..
prevraci.


Odpovedá: Jiri Cincura

15. 9. 2004 18:10

Presne tak. Je to z duvodu rychlosti (dolu jde rychleji). Kompilatoru se to
lepe "cpe" to registru procesoru. Dela to optimalizace. Pokud ale ridici
prom. nekde pouzijes, kde to nejde otocit, optimalizator ti to udela ve
"spravnem" poradi.

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net



Odpovedá: Ing. Marek Kocan

15. 9. 2004 20:21

> Presne tak. Je to z duvodu rychlosti (dolu jde rychleji). Kompilatoru se
to
> lepe "cpe" to registru procesoru. Dela to optimalizace. Pokud ale ridici

heh? ja si dotetka myslel, ze je to stejne rychle, jen je rychlejsi
porovnani na ukonceni smycky/skoku na nule. Ale uz jsem dlouho v ass nic
nedelal a poradneho vlastne nikdy nic  KER


Odpovedá: Slavomir Skopalik

15. 9. 2004 20:23

No, ona je takove hezka instrukce LOOP, ktere dekrementuje ECX a pokud
je vetsi, nez 0 tak skoci.
Takze ECX je idealni ridici promena cyklu  .

Podobnou instrukci mel i Z80, tusim, ze se jmenovala djnb a pro zmenu
dekrementovala
register B a pokud vetsi jak 0, tak skocila.

 Slavek

>
> heh? ja si dotetka myslel, ze je to stejne rychle, jen je
> rychlejsi porovnani na ukonceni smycky/skoku na nule. Ale uz
> jsem dlouho v ass nic nedelal a poradneho vlastne nikdy nic  KER
>
>


Odpovedá: Ing. Marek Kocan

15. 9. 2004 20:31

> No, ona je takove hezka instrukce LOOP, ktere dekrementuje ECX a pokud
> je vetsi, nez 0 tak skoci.
> Takze ECX je idealni ridici promena cyklu  .

YES! to je presne ono, co jsem myslel  KER


Odpovedá: Jiri Cincura

15. 9. 2004 21:21

Ing. Marek Kocan wrote:
> heh? ja si dotetka myslel, ze je to stejne rychle, jen je rychlejsi
> porovnani na ukonceni smycky/skoku na nule. Ale uz jsem dlouho v ass nic
> nedelal a poradneho vlastne nikdy nic  KER

Presne tak. Testuje se pak myslim jen CF (na nulovy registr).

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net



Odpovedá: delphin@post.cz

15. 9. 2004 21:01

> > Presne tak. Je to z duvodu rychlosti (dolu jde rychleji). Kompilatoru se
> to
> > lepe "cpe" to registru procesoru. Dela to optimalizace. Pokud ale ridici
>
> heh? ja si dotetka myslel, ze je to stejne rychle, jen je rychlejsi
> porovnani na ukonceni smycky/skoku na nule. Ale uz jsem dlouho v ass nic
> nedelal a poradneho vlastne nikdy nic  KER

Ctrl+Alt+C vse objasni.


Odpovedá: Jiri Cincura

15. 9. 2004 20:50

Slavomir Skopalik wrote:
> No, ona je takove hezka instrukce LOOP, ktere dekrementuje ECX a pokud je

Ale ta se pak rozlozi na jnz/jmp a podobne, ne? A testuje se Carry Flag.

I kdyz nyni se to mozna dela jinak, mozna jsou dalsi instrukce.  

A ani me nehne zkoumat vysledek prekladu v asm. ;)

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net



Odpovedá: delphin@post.cz

15. 9. 2004 21:18

> No, ona je takove hezka instrukce LOOP, ktere dekrementuje ECX a pokud
> je vetsi, nez 0 tak skoci.
> Takze ECX je idealni ridici promena cyklu  .
>
> Podobnou instrukci mel i Z80, tusim, ze se jmenovala djnb a pro zmenu

Tesne vedle, jmenovala se DJNZ

> dekrementovala
> register B a pokud vetsi jak 0, tak skocila.


Odpovedá: delphin@post.cz

15. 9. 2004 21:18

> Ing. Marek Kocan wrote:
> > heh? ja si dotetka myslel, ze je to stejne rychle, jen je rychlejsi
> > porovnani na ukonceni smycky/skoku na nule. Ale uz jsem dlouho v ass nic
> > nedelal a poradneho vlastne nikdy nic  KER
>
> Presne tak. Testuje se pak myslim jen CF (na nulovy registr).

Tesne vedle, testuje se ZF.


Odpovedá: Jiri Cincura

15. 9. 2004 21:27

delphin@post.cz wrote:
> Tesne vedle, testuje se ZF.

jj, mas pravdu. Ale jen kousek vedle.  

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net



Odpovedá: Dalibor Toman

16. 9. 2004 11:04

On Wednesday, September 15, 2004 8:49 PM [CET], Ing. Marek Kocan
<kocan@ebchod.cz> wrote:

>> Presne tak. Je to z duvodu rychlosti (dolu jde rychleji).
>> Kompilatoru se to lepe "cpe" to registru procesoru. Dela to
>> optimalizace. Pokud ale ridici
>
> heh? ja si dotetka myslel, ze je to stejne rychle, jen je rychlejsi
> porovnani na ukonceni smycky/skoku na nule. Ale uz jsem dlouho v ass
> nic nedelal a poradneho vlastne nikdy nic  KER

samozrejme, ze je to kvuli tomu konci smycky. Detekce nuly v registru
(po nejake operaci s nim) je vzdy nejrychlejsi (a nejmene kodu
zabirajici kontrukuce). Pripadne je mozne pouzit LOOP instrukce, ktere
samy dekrementuji obsah ridici promene (registru)

D. Toman